package dao;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import hbt.HbtUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import bean.ItemListaPreciosVO;
import bean.ListaDePreciosVO;

public class HbtListaDePreciosDao {

	private static SessionFactory sf = null;
	private static HbtListaDePreciosDao instancia = null;

	public static HbtListaDePreciosDao getInstancia() {
		if (instancia == null) {
			sf = HbtUtil.getSessionFactory();
			instancia = new HbtListaDePreciosDao();
		}
		return instancia;
	}

	public void guardarListaDePrecios(ListaDePreciosVO l) {
		Session session = sf.openSession();
		session.beginTransaction();
		session.persist(l);
		session.flush();
		session.getTransaction().commit();
		session.close();
	}

	public ListaDePreciosVO obtenerListaDePrecios(ListaDePreciosVO l) {
		Session session = sf.openSession();
		Transaction trans = session.beginTransaction();
		ListaDePreciosVO oficina = (ListaDePreciosVO) session.get(
				ListaDePreciosVO.class, l.getNro_lista());
		trans.commit();
		session.close();
		return oficina;
	}
	
	///////////////////////comparativas
	
	/*
	@SuppressWarnings("unchecked")
	public List<ItemListaPreciosVO> obtenerComparativa()
	{
		List<ItemListaPreciosVO> comparativa = new ArrayList<ItemListaPreciosVO>();
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		comparativa = session.createQuery("select I from ListaDePreciosVO L join L.items I " +
		"join I.rodamiento R").list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}*/

	
	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session.createQuery("select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, " +
				                                         "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
				                                         "where R.idRodamiento.codigo = :codigo order by I.precio ")
                                                         .setString("codigo", codigo)
				                                         .list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo, String caract)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session.createQuery("select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, " +
				                                         "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
				                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract order by I.precio")
                                                         .setString("codigo", codigo)
				                                         .setString("caract", caract)
				                                         .list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}
	
	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo, String caract, String marca)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session.createQuery("select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, " +
				                                         "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
				                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and R.idRodamiento.marca =:marca order by I.precio ")
                                                         .setString("codigo", codigo)
				                                         .setString("caract", caract)
				                                         .setString("marca", marca)                          
				                                         .list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}
	
	
	@SuppressWarnings("unchecked")
	public List<Object[]> obtenerComparativa(String codigo, String caract, String marca, String origen)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		List<Object[]> comparativa = session.createQuery("select I.precio, I.cantidadMinima, I.cantidadMaxima,  R.idRodamiento.codigo, R.idRodamiento.caracteristica, R.idRodamiento.marca, " +
				                                         "L.nro_lista, P.cuit, R.idRodamiento.origen  from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
				                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and R.idRodamiento.marca =:marca and R.idRodamiento.origen =:origen order by I.precio ")
				                                         .setString("codigo", codigo)
				                                         .setString("caract", caract)
				                                         .setString("marca", marca)
				                                         .setString("origen", origen)			                                         
                                                         .list();
		session.getTransaction().commit();
		session.close();
		return comparativa;
	}
	

	
	/////////////////////// Precios
	
	
	
	
	public float obtenerMejorPrecio(int cant,Date fecha, String codigo)
	{  
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		float result= (Float)session.createQuery(" select isnull(min(I.precio),0)  from ListaDePreciosVO L join L.items I join I.rodamiento R " +
				                                  "where R.idRodamiento.codigo = :codigo and (:cant between I.cantidadMinima and I.cantidadMaxima)" +
				                                  " and :fecha between L.vigenciaDesde and L.vigenciaHasta ")
                                                         .setString("codigo", codigo)
                                                         .setInteger("cant", cant)
                                                         .setDate("fecha",fecha )
                                                         .uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}
	
	
	
	
	
	
	public float obtenerMejorPrecio(int cant,Date fecha,String codigo, String caract)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		float result=(Float) session.createQuery("select isnull(min(I.precio),0)from ListaDePreciosVO L join L.items I join I.rodamiento R " +
												"where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and " +
												":cant between I.cantidadMinima and I.cantidadMaxima" +
												" and :fecha between L.vigenciaDesde and L.vigenciaHasta")
												.setString("codigo", codigo)
												.setString("caract", caract) 
												.setInteger("cant", cant)
                                                .setDate("fecha",fecha )
												.uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}
	
	
	
	
	public float obtenerMejorPrecio(int cant,Date fecha,String codigo, String caract, String marca)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		float item=(Float) session.createQuery("select isnull(min(I.precio),0) from ListaDePreciosVO L join L.items I join I.rodamiento R " +
                								"where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and " +
                								"R.idRodamiento.marca =:marca and" +
                								":cant between I.cantidadMinima and I.cantidadMaxima" +
												" and :fecha between L.vigenciaDesde and L.vigenciaHasta")
												.setString("codigo", codigo)
												.setString("caract", caract)
												.setString("marca", marca)
												.setInteger("cant", cant)
                                                .setDate("fecha",fecha )
												.uniqueResult();
		session.getTransaction().commit();
		session.close();
		return item;
	}
	
	

	public float obtenerMejorPrecio(int cant, Date fecha, String codigo, String caract, String marca, String origen)
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		
		
		float result=(Float) session.createQuery("select isnull(min(I.precio),0) from ListaDePreciosVO L join L.items I join I.rodamiento R " +
				                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and " +
				                                         "R.idRodamiento.marca =:marca and R.idRodamiento.origen =:origen and " +
				                                         ":cant between I.cantidadMinima and I.cantidadMaxima" +
                                                         " and :fecha between L.vigenciaDesde and L.vigenciaHasta")
				                                         .setString("codigo", codigo)
				                                         .setString("caract", caract)
				                                         .setString("marca", marca)
				                                         .setString("origen", origen)
				                                         .setInteger("cant", cant)
                                                         .setDate("fecha",fecha )
                                                         .uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}
	

	
	////////////////////////////////Proveedor
	
	public String obtenerProveedor(int cant, float precio,Date fecha, String codigo, String caract, String marca, String origen)
	
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		
		
		String result=(String) session.createQuery("select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
				                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and " +
				                                         "R.idRodamiento.marca =:marca and R.idRodamiento.origen =:origen and " +
				                                         ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "+
				                                         "and :fecha between L.vigenciaDesde and L.vigenciaHasta")                                                         
				                                         .setString("codigo", codigo)
				                                         .setString("caract", caract)
				                                         .setString("marca", marca)
				                                         .setString("origen", origen)
				                                         .setInteger("cant", cant)
                                                         .setFloat("precio",precio )
                                                         .setDate("fecha",fecha )
                                                         .setFirstResult(0)
                                                         .setMaxResults(1)
                                                         .uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}
	
	
public String obtenerProveedor(int cant, float precio,Date fecha, String codigo, String caract, String marca)
	
	{
		Session session = null;
		session = sf.openSession();
		session.beginTransaction();
		
		
		String result=(String) session.createQuery("select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
				                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and " +
				                                         "R.idRodamiento.marca =:marca and " +
				                                         ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "+
				                                         "and :fecha between L.vigenciaDesde and L.vigenciaHasta")                                                         
				                                         .setString("codigo", codigo)
				                                         .setString("caract", caract)
				                                         .setString("marca", marca)
				                                         .setInteger("cant", cant)
                                                         .setFloat("precio",precio )
                                                         .setDate("fecha",fecha )
                                                         .setFirstResult(0)
                                                         .setMaxResults(1)
                                                         .uniqueResult();
		session.getTransaction().commit();
		session.close();
		return result;
	}
	
	
public String obtenerProveedor(int cant, float precio,Date fecha, String codigo, String caract)

{
	Session session = null;
	session = sf.openSession();
	session.beginTransaction();
	
	
	String result=(String) session.createQuery("select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
			                                         "where R.idRodamiento.codigo = :codigo and R.idRodamiento.caracteristica = :caract and " +
			                                         ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "+
			                                         "and :fecha between L.vigenciaDesde and L.vigenciaHasta")                                                         
			                                         .setString("codigo", codigo)
			                                         .setString("caract", caract)
			                                         .setInteger("cant", cant)
                                                     .setFloat("precio",precio )
                                                     .setDate("fecha",fecha )
                                                      .setFirstResult(0)
                                                      .setMaxResults(1)
                                                     .uniqueResult();
	session.getTransaction().commit();
	session.close();
	return result;
}

public String obtenerProveedor(int cant, float precio,Date fecha, String codigo)

{
	Session session = null;
	session = sf.openSession();
	session.beginTransaction();
	
	
	String result=(String) session.createQuery("select P.cuit from ListaDePreciosVO L join L.items I join I.rodamiento R join L.proveedor P " +
			                                         "where R.idRodamiento.codigo = :codigo and " +
			                                         ":cant between I.cantidadMinima and I.cantidadMaxima and I.precio = :precio "+
			                                         "and :fecha between L.vigenciaDesde and L.vigenciaHasta")                                                         
			                                         .setString("codigo", codigo)
			                                         .setInteger("cant", cant)
                                                     .setFloat("precio",precio )
                                                     .setDate("fecha",fecha )
                                                     .setFirstResult(0)
                                                     .setMaxResults(1)
                                                     .uniqueResult();
	session.getTransaction().commit();
	session.close();
	return result;
}
}
